#include "mti_mtd_processor.h"

// 三脉冲对消器 (MTI)
std::vector<Pulse> MTI_MTDProcessor::processMTI(const std::vector<Pulse> &pulses)
{
    std::vector<Pulse> result;
    result.reserve(pulses.size());

    for (const auto &pulse : pulses)
    {
        // 更新延迟线
        delay_line[delay_line_index] = pulse;
        delay_line_index = (delay_line_index + 1) % 3;

        // 三脉冲对消: y[n] = x[n] - 2x[n-1] + x[n-2]
        if (delay_line_index == 0)
        { // 延迟线已填满
            Pulse cancelled_pulse(params.num_samples);
            for (int i = 0; i < params.num_samples; ++i)
            {
                cancelled_pulse[i] = delay_line[0][i] - 2.0f * delay_line[1][i] + delay_line[2][i];
            }
            result.push_back(cancelled_pulse);
        }
    }

    return result;
}

// 脉冲多普勒处理 (MTD)
PulseDopplerMatrix MTI_MTDProcessor::processMTD(const std::vector<Pulse> &pulses)
{
    int num_pulses = pulses.size();
    PulseDopplerMatrix doppler_matrix(params.num_samples,
                                      std::vector<Complex>(num_pulses, Complex(0, 0)));

    // 创建窗函数
    auto window = SignalProcessor::hanningWindow(num_pulses);

    // 对每个距离门进行多普勒处理
    for (int range_bin = 0; range_bin < params.num_samples; ++range_bin)
    {
        std::vector<Complex> doppler_profile(num_pulses);

        // 提取同一距离门的所有脉冲
        for (int pulse_idx = 0; pulse_idx < num_pulses; ++pulse_idx)
        {
            doppler_profile[pulse_idx] = pulses[pulse_idx][range_bin];
        }

        // 应用窗函数
        SignalProcessor::applyWindow(doppler_profile, window);

        // 应用FFT进行多普勒分析
        SignalProcessor::fft(doppler_profile);

        // 存储结果
        for (int doppler_bin = 0; doppler_bin < num_pulses; ++doppler_bin)
        {
            doppler_matrix[range_bin][doppler_bin] = doppler_profile[doppler_bin];
        }
    }

    return doppler_matrix;
}

// 二维FFT处理 (距离-多普勒)
PulseDopplerMatrix MTI_MTDProcessor::processRangeDoppler(const std::vector<Pulse> &pulses)
{
    int num_pulses = pulses.size();

    // 转换为Eigen矩阵以便处理
    MatrixXcf rd_matrix(num_pulses, params.num_samples);

    for (int i = 0; i < num_pulses; ++i)
    {
        for (int j = 0; j < params.num_samples; ++j)
        {
            rd_matrix(i, j) = pulses[i][j];
        }
    }

    // 应用二维FFT
    SignalProcessor::fft2d(rd_matrix);

    // 转换回结果格式
    PulseDopplerMatrix result(params.num_samples,
                              std::vector<Complex>(num_pulses, Complex(0, 0)));

    for (int i = 0; i < num_pulses; ++i)
    {
        for (int j = 0; j < params.num_samples; ++j)
        {
            result[j][i] = rd_matrix(i, j);
        }
    }

    return result;
}
